package com.atguigu.srb.base.algorithm;

import org.springframework.util.StopWatch;

import java.util.*;

/**
 * @ClassName Solution3
 * @Describe
 * @Author Wangchengshan
 * @Date 2023/5/11 14:33
 * @Version 1.0
 **/
public class Solution3 {
    /**
     * 给你一个数组 time ，其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。
     *
     * 每辆公交车可以 连续 完成多趟旅途，也就是说，一辆公交车当前旅途完成后，可以 立马开始 下一趟旅途。每辆公交车 独立 运行，也就是说可以同时有多辆公交车在运行且互不影响。
     *
     * 给你一个整数 totalTrips ，表示所有公交车 总共 需要完成的旅途数目。请你返回完成 至少 totalTrips 趟旅途需要花费的 最少 时间。
     *
     * 输入：time = [1,2,3], totalTrips = 5
     * 输出：3
     * 解释：
     * - 时刻 t = 1 ，每辆公交车完成的旅途数分别为 [1,0,0] 。
     *   已完成的总旅途数为 1 + 0 + 0 = 1 。
     * - 时刻 t = 2 ，每辆公交车完成的旅途数分别为 [2,1,0] 。
     *   已完成的总旅途数为 2 + 1 + 0 = 3 。
     * - 时刻 t = 3 ，每辆公交车完成的旅途数分别为 [3,1,1] 。
     *   已完成的总旅途数为 3 + 1 + 1 = 5 。
     * 所以总共完成至少 5 趟旅途的最少时间为 3 。
     *
     *
     * 1 <= time.length <= 10的5次方
     * 1 <= time[i], totalTrips <= 10的7次方
     */

    public static long minimumTime(int[] time, int totalTrips) {
        if(time.length == 1){
            return  totalTrips * time[0];
        }
        Arrays.sort(time);
        int start = time[0];
        int end = totalTrips * time[0];
        while (start<end){
            int mid = (start + end)/2;
            long anss = 0l;
            for (int i : time) {
                if(mid < i){
                    break;
                }
                anss = anss + mid / i;
            }
            if(anss >= totalTrips){
                end = mid;
            }else {
                start = mid +1;
            }
        }
        return end;
    }

    public static void main(String[] args) {
//        int[] a = new int[1000];
        Random r = new Random();
//        for (int i = 0; i < 1000; i++) {
//            a[i] = r.nextInt(10000000);
//        }
        int[] a = new int[]{1,2,3};
//        int[] a = new int[]{3};
        StopWatch sp = new StopWatch("时长");
        sp.start();
        long l = minimumTime(a, 300);
        sp.stop();
        System.out.println(sp.prettyPrint());
        System.out.println(l);
    }
}
